package cn.tedu.knows.search.service.impl;

import cn.tedu.knows.commons.model.Tag;
import cn.tedu.knows.commons.model.User;
import cn.tedu.knows.search.repository.QuestionRepository;
import cn.tedu.knows.search.service.IQuestionService;
import cn.tedu.knows.search.util.Pages;
import cn.tedu.knows.search.vo.QuestionVo;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.*;

@Service
@Slf4j
public class QuestionServiceImpl implements IQuestionService{
    @Resource
    private RestTemplate restTemplate;
    @Resource
    private QuestionRepository questionRepository;
    @Override
    public void syncData() {
        // 先发送Ribbon请求获得总页数,以便确定循环次数
        String url=
                "http://faq-service/v2/questions/page/count?pageSize={1}";
        int pageSize=8;
        Integer total=restTemplate.getForObject(
                url,Integer.class,pageSize);
        // 根据总页数确定循环次数
        for(int i=1;i<=total;i++){
            // 循环查询第i页的数据
            url="http://faq-service/v2/questions/" +
                    "page?pageNum={1}&pageSize={2}";
            QuestionVo[] questions=restTemplate.getForObject(
                    url,QuestionVo[].class,i,pageSize);
            //执行批量增,到ES库中
            questionRepository.saveAll(Arrays.asList(questions));
            log.debug("完成第{}页的新增",i);
        }
    }

    // 编写一个根据用户名获得用户对象的方法
    // 以便当前业务逻辑层任何方法调用
    private User getUser(String username){
        String url=
          "http://sys-service/v1/auth/user?username={1}";
        User user=restTemplate.getForObject(
                url,User.class,username);
        return user;
    }

    @Override
    public PageInfo<QuestionVo> search(String key, String username, Integer pageNum, Integer pageSize) {
        User user=getUser(username);
        // 单独编写分页设置
        Pageable pageable= PageRequest.of(pageNum-1,
                pageSize,
                Sort.Direction.DESC,"createtime");
        // 执行查询
        Page<QuestionVo> page=questionRepository
                .queryAllByParams(
                        key,key,user.getId(),pageable);

        // 遍历所有的查询结果,将tags属性赋值
        for(QuestionVo vo:page){
            vo.setTags(tagName2Tags(vo.getTagNames()));
        }

        // 返回时将Page转换为PageInfo
        return Pages.pageInfo(page);
    }

    @Override
    public void saveQuestion(QuestionVo questionVo) {
        questionRepository.save(questionVo);
    }

    // 根据tagNames属性获得tags集合的方法
    private List<Tag> tagName2Tags(String tagNames){
        String[] names=tagNames.split(",");
        // 通过Ribbon调用返回所有标签的方法
        String url="http://faq-service/v2/tags";
        Tag[] tagArr=restTemplate.getForObject(
                url,Tag[].class);
        Map<String,Tag> tagMap=new HashMap<>();
        for(Tag t: tagArr){
            tagMap.put(t.getName(),t);
        }
        List<Tag> tags=new ArrayList<>();
        for(String name:names){
            tags.add(tagMap.get(name));
        }
        return tags;
    }


}







